package com.ikas.ai.utils;

import cn.hutool.core.util.StrUtil;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.ikas.ai.model.PageQuery;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;

import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * @author wuyf
 * @date 2023/7/8 14:48
 */
public class PageExUtil {
    public static void configPageHelper(PageQuery query) {
        setQueryIfNull(query);
        if (StringUtils.isNotBlank(query.getSortBy())) {
            String orderBy = StrUtil.toUnderlineCase(query.getSortBy()) +
                    (StringUtils.isNotBlank(query.getSortType()) ? " " + query.getSortType() : "");
            PageHelper.startPage(query.getPage(), query.getSize(),
                    orderBy);
        }else {
            PageHelper.startPage(query.getPage(), query.getSize());
        }
    }

    public static void configPageHelper(PageQuery query, boolean defCount) {
        setQueryIfNull(query);
        if (StringUtils.isNotBlank(query.getSortBy())) {
            String orderBy = StrUtil.toUnderlineCase(query.getSortBy()) +
                    (StringUtils.isNotBlank(query.getSortType()) ? " " + query.getSortType() : "");
            PageHelper.startPage(query.getPage(), query.getSize(), defCount);
            PageHelper.startPage(orderBy);
        }else {
            PageHelper.startPage(query.getPage(), query.getSize(), defCount);
        }
    }

    private static void setQueryIfNull(PageQuery query) {
        if (ObjectUtils.isEmpty(query.getPage())) {
            query.setPage(1);
        }
        if (ObjectUtils.isEmpty(query.getSize())) {
            query.setSize(10);
        }

    }

    public static PageInfo<List<Object>> transPageInfo(int pageNum, int pageSize, Long count, List<List<Object>> data) {
        PageInfo<List<Object>> pageInfo = new PageInfo<>(data);
        pageInfo.setTotal(count);
        pageInfo.setPageNum(pageNum);
        pageInfo.setPageSize(pageSize);
        pageInfo.setPages((int) Math.ceil((double) count / pageSize));
        int startRow = pageNum > 0 ? (pageNum - 1) * pageSize : 0;
        int endRow = startRow + pageSize * (pageNum > 0 ? 1 : 0);
        pageInfo.setStartRow(startRow);
        pageInfo.setEndRow(endRow);
        pageInfo.calcByNavigatePages(PageInfo.DEFAULT_NAVIGATE_PAGES);
        return pageInfo;
    }

    /**
     * 将PageInfo对象泛型中的Po对象转化为Vo对象
     * @param pageInfoPo PageInfo<Po>对象</>
     * @param mapper 转换函数
     * @param <P> Po类型
     * @param <V> Vo类型
     * @return PageInfo<V>
     */
    public static <P, V> PageInfo<V> convert(PageInfo<P> pageInfoPo, Function<? super P, ? extends V> mapper) {
        List<? extends V> collect = pageInfoPo.getList().stream().map(mapper).collect(Collectors.toList());
        Page<V> page = new Page<>(pageInfoPo.getPageNum(), pageInfoPo.getPageSize());
        page.setTotal(pageInfoPo.getTotal());
        page.addAll(collect);
        return new PageInfo<>(page);
    }
}
